package it.scambiocorse.areaprivata.cron;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;

import it.scambiocorse.dao.CodaService;
import it.scambiocorse.dao.ServizioService;
import it.scambiocorse.dao.UtenteService;
import it.scambiocorse.model.CodaType;
import it.scambiocorse.model.CronBean;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.utils.Utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.sun.naming.internal.ResourceManager;

public class AssegnaCorse implements Controller {
	final Logger logger = Logger.getLogger(getClass());
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {


		/**
		 * Questa classe assegna le varie corse
		 * 
		 * 	OPERAZIONI DA ESEGUIRE
		 * 1 Query su db per code in scadenza 
		 * */
		
		
		if (request.getRemoteAddr().equals("") ) {
			assegnaCorse();
		
		}else {
			
			Timestamp now = Utils.getSysDate();
			int token = (now.getYear() + now.getMonth()+ now.getDate())* now.getDay();
			String tokenStr = "DANIELESCANBIOCORSE"+token;
			String md5 = toMd5(tokenStr);
			
			
			String sentToken = request.getParameter("ret");
			if (Utils.isValid(sentToken) ) {
				if (sentToken.equals(md5)) {
					
				}
			}
		}
		
		
		
		
		
		return null;
	}


	public static String toMd5(String input){
     String res = "";
     try {
         MessageDigest algorithm = MessageDigest.getInstance("MD5");
         algorithm.reset();
         algorithm.update(input.getBytes());
         byte[] md5 = algorithm.digest();
         String tmp = "";
         for (int i = 0; i < md5.length; i++) {
             tmp = (Integer.toHexString(0xFF & md5[i]));
             if (tmp.length() == 1) {
                 res += "0" + tmp;
             } else {
                 res += tmp;
             }
         }
     } catch (NoSuchAlgorithmException ex) {}
     return res;
 }
	
	 private void assegnaCorse() {
		 String metodo = "assegnaCorse() - ";
		 logger.warn(metodo+"Inizio" );
		 int idServ = 0;
		 try {
			 		
			 			ServizioService servizioDao = (ServizioService)it.scambiocorse.utils.ResourceManager.getBean("servizioService");
			 			CodaService codaDao = (CodaService)it.scambiocorse.utils.ResourceManager.getBean("codaService");
			 			UtenteService utenteDao = (UtenteService)it.scambiocorse.utils.ResourceManager.getBean("utenteService");
			 			logger.warn(metodo+"Estraggo la lista dei servizi in scadenza");
			 			ArrayList<ServizioType> listaServizi = servizioDao.listaServiziPrivatiInScadenza();
			 			
			 			//per ogni servizio..
			 			for (ServizioType s : listaServizi) {
			 				logger.warn(metodo+" Servizio "+s.getIdServ());
			 				int idUserExec = 0;
			 				idServ = s.getIdServ();
			 				
			 				logger.warn(metodo+"Estraggo la lista dei clienti in coda");
			 				ArrayList<CronBean> listaCron = servizioDao.dettaglioUserPartPerServ(s.getIdServ());
			 				
			 				//il metodo per assegnare e' diverso se per l'area pubblica perche' quest'ultimo deve prendere in considerazione i feedback
//			 				if (s.getIdArea() != 1) 
//			 					idUserExec = assegnaAutista(listaCron);
//			 				else
//			 					idUserExec = assegnaAutistaPubblica(listaCron);
			 				try {
				 				idUserExec = assegnaAutista(listaCron);
				 				servizioDao.assegnaCorsaPrivata(s.getArea().getIdArea(), s.getIdServ(), idUserExec);
			 				} catch (Exception e) {
			 					logger.error(metodo+"Servizio non assegnato");
			 					servizioDao.setServizioKO(idServ);
			 				}
			 			}
			 			
			 			
		 } catch (Exception e) {
				logger.error("SI E' VERIFICATO UN ERRORE DURANTE L'ASSEGNAZIONE");
				logger.error("Servizio: "+idServ);
				logger.error(e);
			}
			 
 }
		 
		 
			
		


	private int assegnaAutistaPubblica(ArrayList<CronBean> listaCron) {
		// TODO Auto-generated method stub
		return 0;
	}


	private int assegnaAutista(ArrayList<CronBean> listaCron) throws Exception {
		String metodo = "assegnaAutista(...) - ";
		logger.warn(metodo+"Inizio");
		int idUser = 0;
	try {
				double maxDare = 0;
				for (CronBean c : listaCron) {
					if (c.getDare() > maxDare) {
						maxDare = c.getDare();
						idUser = c.getIdUser();
					}
				}
	} catch (Exception e) {
		logger.warn("SI E' VERIFICATO UN ERRORE NELL'ASSEGNAZIONE DELL'AUTISTA");
		throw e;
	}
		return idUser;
	}
	
}